package br.edu.ifrn.os.simulador;

import java.util.List;

import br.edu.ifrn.os.simulador.cpu.CPU;
import br.edu.ifrn.os.simulador.cpu.Despachador;
import br.edu.ifrn.os.simulador.cpu.Escalonador;
import br.edu.ifrn.os.simulador.processo.Processo;

public class Main {
	private CPU cpu = null;
	private Despachador despachador = null;
	private Escalonador escalonador = null;
	
	public static void main(String[] args) {
		Main main = new Main();
		main.confirar();
	}
	
	private void confirar() {
		this.cpu = gerarCPU();
		this.despachador = gerarDespachador(this.cpu);
		this.escalonador = gerarEscalonador();
	}

	// exemplo de simulacao para gerar novos processos, escalona-los e despacha-los
	private void executar() {
		// SO gera 10 novos processos
		List<Processo> processos = gerarProcessos(10);
		// SO adiciona no escalonador os novos processos
		for (Processo processo : processos) this.escalonador.adicionar(processo);
		// SO organiza processos em estado de pronto
		this.escalonador.escalonar();
		// SO recupera processo da vez, e realiza o despacho
		this.despachador.executar( this.escalonador.getProximo() );
		// SO gera 5 novos processos
		processos = gerarProcessos(5);
		// SO adiciona no escalonador os novos processos
		for (Processo processo : processos) this.escalonador.adicionar(processo);
		// SO organiza processos em estado de pronto
		this.escalonador.escalonar();
		// SO recupera alguns processo e os despacha
		for (int i = 0; i < this.escalonador.getProcessosEscalonados().size() / 2; i++)
			this.despachador.executar( this.escalonador.getProximo() );
		// OS gera 5 novos processos
		processos = gerarProcessos(5);
		// SO organiza os processos em estado de pronto
		this.escalonador.escalonar();
		// SO recupera os processos em estado de pronto e os despacha
		for (int i = 0; i < this.escalonador.getProcessosEscalonados().size(); i++)
			this.despachador.executar( this.escalonador.getProximo() );
	}

	private Escalonador gerarEscalonador() {
		// TODO Auto-generated method stub
		return null;
	}

	private Despachador gerarDespachador(CPU cpu2) {
		// TODO Auto-generated method stub
		return null;
	}

	private CPU gerarCPU() {
		// TODO Auto-generated method stub
		return null;
	}

	private List<Processo> gerarProcessos(int quantidade) {
		// TODO Auto-generated method stub
		return null;
	}

}
